package tech.edwardvan.designpattern.pattern.structural.bridge;

import lombok.extern.slf4j.Slf4j;

/**
 * 桥接模式
 * <p>
 * 优点:
 * 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统.
 * <p>
 * 缺点:
 * 桥接模式的引入会增加系统的理解与设计难度
 *
 * @author EdwardVan
 */
@Slf4j
public class BridgeDemo {

    public static void main(String[] args) {
        //复用性比较差,拓展性差
        EventLevel message = new CommonSMSEvent();
        message.sendMessage("测试消息", "EdwardVan");
        message = new UrgencyEmailEvent();
        message.sendMessage("测试消息", "EdwardVan");
    }

    /**
     * 事件等级接口
     */
    private interface EventLevel {
        /**
         * 发送消息
         *
         * @param message 消息内容
         * @param toUser  消息接收人
         */
        void sendMessage(String message, String toUser);
    }

    /**
     * 事件类型:普通
     * 发送渠道:短信
     */
    private static class CommonSMSEvent implements EventLevel {
        @Override
        public void sendMessage(String message, String toUser) {
            log.info("使用短信发送消息[{}]到[{}]", message, toUser);
        }
    }

    /**
     * 事件类型:普通
     * 发送渠道:邮件
     */
    private static class CommonEmailEvent implements EventLevel {
        @Override
        public void sendMessage(String message, String toUser) {
            log.info("使用邮件发送消息[{}]到[{}]", message, toUser);
        }
    }

    /**
     * 事件类型:紧急
     * 发送渠道:短信
     */
    private static class UrgencySMSEvent implements EventLevel {
        @Override
        public void sendMessage(String message, String toUser) {
            message = "加急:" + message;
            log.info("使用短信发送消息[{}]到[{}]", message, toUser);
        }
    }

    /**
     * 事件类型:紧急
     * 发送渠道:邮件
     */
    private static class UrgencyEmailEvent implements EventLevel {
        @Override
        public void sendMessage(String message, String toUser) {
            message = "加急:" + message;
            log.info("使用邮件发送消息[{}]到[{}]", message, toUser);
        }
    }

}
